package com.gome.boot.config.tools;

import com.gome.boot.common.util.StringToUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
 * Diamond配置数据处理工具.
 *
 * @author baoxiufeng
 */
@Component
public class ConfigTool {

    @Autowired
    private Environment env;

    /**
     * 获取指定diamondKey对应的值.
     *
     * @param key 待获取配置对应的diamondKey
     * @param defaultValue diamondKey不存在时使用的默认值
     * @return 获取到的配置内容
     */
    public String get(String key, String defaultValue) {
        return env.getProperty(key, defaultValue);
    }

    /**
     * 获取指定diamondKey对应的值.
     *
     * @param key 待获取配置对应的diamondKey
     * @param clazz 待获取配置内容类型
     * @param defaultValue diamondKey不存在时使用的默认值
     * @param <T> 待获取配置内容类型泛型
     * @return 获取到的配置内容
     */
    public <T> T get(String key, Class<T> clazz, T defaultValue) {
        return env.getProperty(key, clazz, defaultValue);
    }

    /**
     * 获取指定diamondKey对应的值.
     * <br/>要求diamondKey必须存在.
     *
     * @param key 待获取配置对应的diamondKey
     * @return 获取到的配置内容
     */
    public String get(String key) {
        return env.getRequiredProperty(key);
    }

    /**
     * 获取指定diamondKey对应的值.
     * <br/>要求diamondKey必须存在.
     *
     * @param key 待获取配置对应的diamondKey
     * @param clazz 待获取配置内容类型
     * @param <T> 待获取配置内容类型泛型
     * @return 获取到的配置内容
     */
    public <T> T get(String key, Class<T> clazz) {
        return env.getRequiredProperty(key, clazz);
    }

    /**
     * 字符串转列表.
     * <br/>待转换字符串格式要求：key=A1,A2,A3,...An
     * <br/>分隔符顺序：逗号
     *
     * @param key 待转换字符串对应的diamondKey
     * @return 转换后的字符串列表
     */
    public List<String> getList(String key) {
        return getList(key, String.class);
    }

    /**
     * 字符串转列表.
     * <br/>待转换字符串格式要求：key=A1,A2,A3,...An
     * <br/>分隔符顺序：逗号
     *
     * @param key 待转换字符串对应的diamondKey
     * @param clazz 转换后的值类型
     * @return 转换后的字符串列表
     */
    public <T> List<T> getList(String key, Class<T> clazz) {
        return StringToUtils.stringToList(env.getProperty(key), clazz);
    }

    /**
     * 字符串转集合.
     * <br/>待转换字符串格式要求：key=A1=A1,B1=B1,C1=C1
     * <br/>分隔符顺序：逗号 -> 等号
     *
     * @param key 待转换字符串对应的diamondKey
     * @return 转换后的集合
     */
    public Map<String, String> getMap(String key) {
        return getMap(key, String.class);
    }

    /**
     * 字符串转集合.
     * <br/>待转换字符串格式要求：key=A1=A1,B1=B1,C1=C1
     * <br/>分隔符顺序：逗号 -> 等号
     *
     * @param key 待转换字符串对应的diamondKey
     * @param clazz 转换后的值类型
     * @param <T> 转换后的值类型
     * @return 转换后的集合
     */
    public <T> Map<String, T> getMap(String key, Class<T> clazz) {
        return StringToUtils.stringToMap(env.getProperty(key), clazz);
    }

    /**
     * 字符串转列表集合.
     * <br/>待转换字符串格式要求：key=A=A1,A2,A3,...An;B=B1,B2,B3,...Bn
     * <br/>分隔符顺序：分号 -> 等号 -> 逗号
     *
     * @param key 待转换字符串对应的diamondKey
     * @return 转换后的列表集合
     */
    public Map<String, List<String>> getListMap(String key) {
        return getListMap(key, String.class);
    }

    /**
     * 字符串转列表集合.
     * <br/>待转换字符串格式要求：key=A=A1,A2,A3,...An;B=B1,B2,B3,...Bn
     * <br/>分隔符顺序：分号 -> 等号 -> 逗号
     *
     * @param key 待转换字符串对应的diamondKey
     * @param clazz 转换后的列表中值类型
     * @param <T> 转换后的列表中值类型
     * @return 转换后的列表集合
     */
    public <T> Map<String, List<T>> getListMap(String key, Class<T> clazz) {
        return StringToUtils.stringToListMap(env.getProperty(key), clazz);
    }
}
